#include "memu.h"
#include "key.h"
#include "display.h"
#include "debug.hpp"

// 屏幕亮度
uint8_t disp_brightness = 255;

KEY5 key;
uint8_t global_index = 0;
uint8_t last_index = 0;
void (*current_function)();

MEMU memuTable[10] = {
    // 第一层
    {0, 2, 1, 3, 255, 255, "list1", (*index0_fun)},
    {1, 0, 2, 5, 255, 255, "list2", (*index1_fun)},
    {2, 1, 0, 6, 255, 255, "list3", (*index2_fun)},

    // 第二层_1
    {3, 4, 4, 7, 255, 255, "brightness", (*index3_fun)},
    {4, 3, 3, 8, 255, 255, "exit", (*index4_fun)},

    // 第二层_2
    {5, 255, 255, 1, 255, 255, "list2_1", (*index5_fun)},

    // 第二层_3
    {6, 255, 255, 2, 255, 255, "list3_1", (*index6_fun)},

    // 第三层_1
    {7, 255, 255, 3, 254, 254, "disp_brightness", (*index7_fun)},
    // 第三层_2
    {8, 255, 255, 0, 254, 254, "", (*index8_fun)}

};

void memu_init(void)
{
}
void memu_run(void)
{
    static uint8_t last_key_vaule;
    static uint32_t last_time;
    uint8_t key_vaule = key_is_press(&key);
    if (key_vaule)
    { // 有按键按下，且仅处理最高优先级
        key_clear(&key);
        if (last_key_vaule == key_vaule && (millis() - last_time < 250)) // 消抖
            return;
        // if(millis - last_time < 200)
        //     return ;
        uint8_t temp_index;
        temp_index = global_index;
        if (key_vaule == 1)
        {                                               // center press
            if (memuTable[temp_index].center_to != 255) // 不指向空
            {
                global_index = memuTable[temp_index].center_to;
                current_function = memuTable[global_index].process_function;
                // 执行相关函数
                (*current_function)();
            }
        }
        else if (key_vaule == 2)
        {                                           // up press
            if (memuTable[temp_index].up_to != 255) // 不指向空
            {
                global_index = memuTable[temp_index].up_to;
                current_function = memuTable[global_index].process_function;
                // 执行相关函数
                (*current_function)();
            }
        }
        else if (key_vaule == 3)
        {                                             // down press
            if (memuTable[temp_index].down_to != 255) // 不指向空
            {
                global_index = memuTable[temp_index].down_to;
                current_function = memuTable[global_index].process_function;
                // 执行相关函数
                (*current_function)();
            }
        }
        else if (key_vaule == 4)
        {                                             // left press
            if (memuTable[temp_index].left_to <200 ) // 不指向空
            {
                global_index = memuTable[temp_index].left_to;
                current_function = memuTable[global_index].process_function;
                // 执行相关函数
                (*current_function)();
            }
            else if (memuTable[temp_index].left_to == 254) // 特殊功能     数值加减
            {
                if (temp_index == 7) // 第七个元素
                {
                    disp_brightness--;
                    // DEBUG_EVENT((const char *)"--");
                    current_function = memuTable[temp_index].process_function;
                    // 执行相关函数
                    (*current_function)();
                }
            }
        }
        else if (key_vaule == 5)
        {                                              // right press
            if (memuTable[temp_index].right_to < 200) 
            {
                global_index = memuTable[temp_index].right_to;
                current_function = memuTable[global_index].process_function;
                // 执行相关函数
                (*current_function)();
            }
            else if  (memuTable[temp_index].right_to == 254) // 特殊功能     数值加减
            {
                if (temp_index == 7) // 第七个元素
                {
                    disp_brightness++;
                    // DEBUG_EVENT((const char *)"++");
                    current_function = memuTable[global_index].process_function;
                    // 执行相关函数
                    (*current_function)();
                }
                
            }
        }
        last_key_vaule = key_vaule;
        last_time = millis();
    }
}

void clear_display(void);
void show_string(uint8_t line, char *str, uint8_t mode);

void index0_fun(void)
{
    // 显示第一层的前三条，并选择第一条
    clear_display();
    show_string(0, memuTable[0].name, 1);
    show_string(1, memuTable[1].name, 0);
    show_string(2, memuTable[2].name, 0);
}
void index1_fun(void)
{
    clear_display();
    show_string(0, memuTable[0].name, 0);
    show_string(1, memuTable[1].name, 1);
    show_string(2, memuTable[2].name, 0);
}
void index2_fun(void)
{
    clear_display();
    show_string(0, memuTable[0].name, 0);
    show_string(1, memuTable[1].name, 0);
    show_string(2, memuTable[2].name, 1);
}
void index3_fun(void)
{
    clear_display();
    show_string(0, memuTable[3].name, 1);
    show_string(1, memuTable[4].name, 0);
}
void index4_fun(void)
{
    clear_display();
    show_string(0, memuTable[3].name, 0);
    show_string(1, memuTable[4].name, 1);
}
void index5_fun(void)
{
    clear_display();
    show_string(0, memuTable[5].name, 1);
}
void index6_fun(void)
{
    clear_display();
    show_string(0, memuTable[6].name, 1);
}
void index7_fun(void)
{
    clear_display();
    set_brightness(disp_brightness);
    show_string(0, memuTable[7].name, 1);
    show_number(1, disp_brightness, 0);
    // show_string(1,"");
}
void index8_fun(void)
{
    clear_display();
    show_string(0, memuTable[0].name, 1);
    show_string(1, memuTable[1].name, 0);
    show_string(2, memuTable[2].name, 0);

}
void index9_fun(void)
{
}